package auctionatr

/**
 * automatischer E-Mail Versand bei verschiedenen Events
 * @author mv
 *
 */
class MailJob {
	
	static transactional = true
	
	def watch
	
	static mapping = {
		watch lazy: false
	}
	
	def timeout = 30000l // alle 30 sec

	SendEmailService sendEmailService

	// aller 30 sec folgende Funktion ausführen:
	def execute() {
		// abgelaufene Auktionen
		watch = Auction.findAll("FROM Auction a WHERE a.finishDate <= ? AND a.completed = false", new Date())
		print "Number of auctions to be finished: "
		println watch.size()
		
		// durchgehen und Auktionen beenden
		for(int i=0; i < watch.size(); i++) {
			finishAuctions(watch[i])
		}
		
		// durchgehen und ggf. E-Mail versenden
		for(int i=0; i < watch.size(); i++) {
			loop(watch[i])
		}
	} // execute
	
	def finishAuctions(auc) {
		// Auktion auf abgelaufen setzen
		if(auc != null) {
			print "Auction finished is called "
			println auc.name
			auc.completed = true
			if(!auc.hasErrors()) {
				auc = auc.merge(flush: true, validate: false)
			} else {
				println auc.errors
			}
		}
	}
	
	def loop (Auction auc) {
		def winningUser
		def winningBid
		
		winningBid = null;
		winningBid = Bid.findByAuctions(auc, [max: 1, order: 'desc', sort: 'gebot'])

		// wenn Bieter vorhanden, Mail versenden
		if(winningBid) {
			winningUser = null;
			winningUser = winningBid.users

			// an den Höchstbietenden
			sendEmailService.sendEmailWhenAuctionWon([
						email : auc.users.email, // winningUser.email
						name : winningUser.username,
						auction : auc.name,
						bid : winningBid.gebot
					])

			// an den Verkäufer
			sendEmailService.sendEmailToSellerWhenAuctionFinished([
						email: auc.users.email,
						name : auc.users.username,
						auction : auc.name,
						bid : winningBid.gebot,
						bidder : winningUser.username
					])
		} else { // wenn kein Gebot vorhanden
		
		// an den Verkäufer falls kein Gebot vorhanden
		sendEmailService.sendEmailToSellerWhenAuctionFinishedWithoutBid([
					email: auc.users.email,
					name : auc.users.username,
					auction : auc.name,
				])
		} // winningBid


	}
	

} // MailJob
